我正在使用Hibernate 4.1.3.Final与JPA 2.1和MySQL 5.5.37.我有一个具有以下字段的实体:
@Entity
@Table(name = "category",
uniqueConstraints = { @UniqueConstraint(columnNames = { "NAME" })}
)
public class Category implements Serializable, Comparable<Category> {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "ID")
@GeneratedValue(generator = "uuid-strategy")
private String id;
@NotEmpty
private Set<Subject> subjects;
...
}
Run Code Online (Sandbox Code Playgroud)
没有简单的连接表来链接该subjects字段,而是有一个稍微复杂的MySQL查询.以下是给出特定类别ID的主题的示例:
SELECT DISTINCT e.subject_id
FROM category c, resource_category rc, product_resource pr,
sb_product p, product_book pe, book e
WHERE c.id = rc.category_id
AND rc.resource_id = pr.resource_id
AND pr.product_id = p.id
AND p.id …Run Code Online (Sandbox Code Playgroud) 嗨我有2张桌子如下
表格1:
+-------------------+
| ID LOB col1 col2 |
+-------------------+
主键(ID和LOB)
表2:
+-----------------+
| SK ID col3 col4 |
+-----------------+
主键(SK)
我需要从表2到table1给出多对一的关系,因为table1具有compositePrimaryKey(ID和LOB),但table2没有任何与LOB相关的列.我无法提供映射.请帮忙.
编辑我已经尝试了Table2的hibernate映射:
<many-to-one name="class1Obj" class="com.acs.enterprise.common.Class1"
lazy="proxy" insert="false" update="false">
<column name="ID" />
<column name="LOB" />
</many-to-one>
Run Code Online (Sandbox Code Playgroud)
以上不起作用.在获取记录时,它尝试从table2获取LOB代码,这在表1中根本不存在
我有两个实体之间的简单关联 - Category和Email(NtoM).我正在尝试创建用于浏览和管理它们的Web界面.我有一个简单的电子邮件订阅编辑表单,其中包含表示给定电子邮件所属类别的复选框列表(我注册了Set<Category>类型的属性编辑器).
表格显示效果很好,包括标记当前指定的类别(对于现有的电子邮件).但是没有更改保存到EmailsCategories表(NtoM映射表,定义的表@JoinTable- 既没有添加新检查的类别,也没有删除未选中的类别.
邮件实体:
@Entity
@Table(name = "Emails")
public class Email
{
@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid2")
@Column(length = User.UUID_LENGTH)
protected UUID id;
@NaturalId
@Column(nullable = false)
@NotEmpty
@org.hibernate.validator.constraints.Email
protected String name;
@Column(nullable = false)
@Temporal(TemporalType.TIMESTAMP)
protected Date createdAt;
@Column
protected String realName;
@Column(nullable = false)
protected boolean isActive = true;
@ManyToMany(mappedBy = "emails", fetch = FetchType.EAGER)
protected Set<Category> categories = new HashSet<Category>(); …Run Code Online (Sandbox Code Playgroud) 我正在使用Hibernate作为我们的对象关系映射,使用一个隐藏数据库的自定义方言.
我从这个数据库中检索的实体有一列:
@Column(name = "GROSS_WEIGHT", precision = 9, scale = 3)
private BigDecimal grossWeight;
Run Code Online (Sandbox Code Playgroud)
数据库将此列定义为数字,精度为9,标度为3.
我可以看到Hibernate生成的SQL来检索数据,当我使用数据库查询工具执行相同的Query时,它会返回GROSS_WEIGHT列的"9.68".
但是,在由Hibernate检索的实体中,'grossWeight'字段包含值'10',其中scale0和precision2 为0 !
在我正在使用的自定义方言类中,我尝试重写以下列类型:
registerColumnType( Types.DECIMAL, "numeric($p,$s)" );
registerColumnType( Types.DOUBLE, "numeric($p,$s)" );
registerColumnType( Types.NUMERIC, "numeric($p,$s)" );
Run Code Online (Sandbox Code Playgroud)
但它仍然只返回(舍入的)整数.
这在我们使用Postgres方言从Postgres检索对象的应用程序的其他地方有效.
知道我应该在方言中做什么,所以我可以让Hibernate正确设置检索到的BigDecimal的精度/比例?
我有两个POJO,STOCK和STOCK_DETAILS(一对多的关系).我还有一个接口IAUDITLOG(有两种方法).我需要用BOTH POJO实现这个接口,并希望在这些方法中编写一些实现.但是当我用子类"STOCKDETAILS"实现IAUDITLOG接口时,它会给出异常"你应该有setter属性"
股票类别:
@Entity
@Table(name = "stock")
public class Stock implements java.io.Serializable, IAuditLog
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer stockId;
@Column(name = "STOCK_CODE")
private String stockCode;
@Column(name = "STOCK_NAME")
private String stockName;
@OneToMany( fetch = FetchType.LAZY, mappedBy = "stock")
public Set<StockDetail> stockDetails = new HashSet<StockDetail>(0);
public Set<StockDetail> getStockDetails() {
return stockDetails;
}
public void setStockDetails(Set<StockDetail> stockDetails) {
this.stockDetails = stockDetails;
}
public Integer getStockId() {
return stockId;
}
public void setStockId(Integer stockId) { …Run Code Online (Sandbox Code Playgroud) Hibernate新手.
我有多个用户组关系.三个表:User,Group和UserGroup映射表.
实体:
@Entity
@Table(name = "user")
public class User {
@Id
@Column (name = "username")
private String userName;
@Column (name = "password", nullable = false)
private String password;
@ManyToMany(cascade = {CascadeType.ALL}, fetch = FetchType.EAGER)
@JoinTable(name="usergroup",
joinColumns={@JoinColumn(name="username")},
inverseJoinColumns={@JoinColumn(name="groupname")})
private Set<Group> userGroups = new HashSet<Group>();
... setter and getters
@Entity
@Table(name = "group")
public class Group {
@Id
@Column(name = "groupname")
private String groupName;
@Column(name = "admin", nullable = false)
private String admin;
@ManyToMany(mappedBy = "userGroups", fetch = FetchType.EAGER)
private Set<User> …Run Code Online (Sandbox Code Playgroud) 因此,如果某些表缺少主键,那么innodb的行为可能会导致问题.
因此,对于Hibernate,我正在寻找一个键来指定@ElementCollection表上的主键,其中Set为底层数据结构.
我找到了一种使用地图的主键的方法,但它有点奇怪,因为我不需要地图.
我还找到了与@Embeddable相关的答案,但我不需要那种复杂性.我在我的实体中使用Set或Set作为数据结构.
知道如何实现吗?
我可以配置Hibernate自动扫描包创建一个SessionFactory从@Entity注释豆?
目前我正在使用
Configuration config = new Configuration() ;
config.addAnnotatedClass(MyEntity.class);
Run Code Online (Sandbox Code Playgroud)
我不想hibernate.cfg.xml用来配置映射.
请注意我想在普通的Java项目中实现这一点,而不使用任何Spring或此类框架.
使用Spring之前已经回答了类似的问题,但我想在不使用Spring或其他框架的情况下实现它.我对一些这样做的简单库开放.
我们的问题是,由于源自Hibernate ,我们无法从遗留数据库中获取数据(包括长度为0的空字符串).我们想改变Hibernate的行为以正确解析空字符串.StringIndexOutOfBoundsExceptiionCharacterTypeDescriptor
示例数据:
1, 'Berlin', 17277, '', 'aUser'
2, 'London', 17277, '', 'anotherUser'
Run Code Online (Sandbox Code Playgroud)
我们使用hibernate javax.persistence.Query.
String sql = "SELECT * FROM table";
Query query = entityManager.createNativeQuery(sql);
List resultList = query.getResultList();
Run Code Online (Sandbox Code Playgroud)
这导致StringIndexOutOfBoundsException它的根是来自Hibernate的以下代码:
if ( String.class.isInstance( value ) ) {
final String str = (String) value;
return Character.valueOf( str.charAt(0) ); // this fails, as there is no char at position 0
}
Run Code Online (Sandbox Code Playgroud)
hibernate论坛上的帖子证实了这一点.
我们没有选择从这个错误的版本升级hibernate,并寻找一种方法来改变Hibernate的映射.
我们不能使用PreparedStatements或普通的JDBC-Connections,也不能使用JPA-Entities.
也不可能改变遗留数据库.SQL语句使用DBVisualizer完美运行.
有没有改变Hibernate映射字符串的方式?
我使用Spring Data并决定创建可以在Hibernate实体中使用的新自定义数据类型.我检查了文档,BasicType并根据此官方用户指南选择并实施它.
我希望能够在其类名下注册该类型,并且能够在实体中使用新类型而无需@Type注释.不幸的是,我无法引用MetadataBuilder或Hibernate配置来注册新类型.有没有办法在Spring Data中获取它?似乎Hibernate的初始化对用户是隐藏的,并且不能轻易访问.我们使用以下类来初始化JPA:
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "entityManagerFactory",
transactionManagerRef = "transactionManager",
basePackages = {
"..." // omitted
}
)
public class JpaConfiguration implements TransactionManagementConfigurer {
@Primary
@Bean(name = "entityManagerFactory")
public LocalContainerEntityManagerFactoryBean configureEntityManagerFactory(
DataSource dataSource,
SchemaPerTenantConnectionProviderImpl provider) {
LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
entityManagerFactoryBean.setPersistenceUnitName("defaultPersistenceUnit");
entityManagerFactoryBean.setDataSource(dataSource);
entityManagerFactoryBean.setPackagesToScan(
"..." // omitted
);
entityManagerFactoryBean.setJpaProperties(properties(provider));
entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
return entityManagerFactoryBean;
}
@Primary
@Bean(name = "transactionManager")
public PlatformTransactionManager annotationDrivenTransactionManager() {
return new JpaTransactionManager();
}
private Properties properties(SchemaPerTenantConnectionProviderImpl …Run Code Online (Sandbox Code Playgroud) hibernate ×10
java ×9
jpa ×5
orm ×3
many-to-many ×2
spring ×2
bigdecimal ×1
database ×1
mysql ×1
spring-data ×1
spring-mvc ×1