Java 休眠保存集合
我正在使用Hibernate4(与Spring一起)将我的对象持久化到数据库中。 当我尝试用集合子对象保存父对象时,出现了一些问题 我的桌子:Java 休眠保存集合,java,hibernate,hibernate-mapping,Java,Hibernate,Hibernate Mapping,我正在使用Hibernate4(与Spring一起)将我的对象持久化到数据库中。 当我尝试用集合子对象保存父对象时,出现了一些问题 我的桌子: | A | => PK (Composite) [String + Integer] | B | => PK (Composite) [Stirng + Integer] + Integer 自然地,B的PK与A的PK相同,A包含B的集合 在我的代码中,我希望: A parent = new A(); parent.addCollectio
| A | => PK (Composite) [String + Integer]
| B | => PK (Composite) [Stirng + Integer] + Integer
自然地,B的PK与A的PK相同,A包含B的集合
在我的代码中,我希望:
A parent = new A();
parent.addCollection(new B());
parentDao.create(parent)
当Hibernate分配对象时,它可以将一个字符串设置为PK,并计算Inter的max+1。
对于B PK,Hibernate同样从A(父项=>子项)设置相同的PK值,并计算第二个Intenger的max+1
有可能吗?
提前谢谢
编辑
我的班级:
A类{
静态类A_PK{
私有字符串codAzienda;
私人整数年;
…Get、Set、HashCode、Equals和toString()。。。
}
私人A_PK id;
…另一个专栏。。。
@OneToMany(级联=全部)
@连接柱({
@JoinColumn(name=“cod_azienda”),
@JoinColumn(name=“年”)
})
列出儿童名单;
}
B类{
静态类B_PK{
私有字符串codAzienda;
私人整数年;
私有整数nextId;
…Get、Set、HashCode、Equals和toString()。。。
}
@嵌入ID
@属性溢出({
@属性覆盖(name=“codAzienda”,column=@column(name=“cod_azienda”),
@AttributeOverride(name=“codCliente”,column=@column(name=“cod\u cliente”))
})
私人B_PK id;
…另一个专栏。。。
}
尝试以下操作:
A.java
@Entity
@Table(name = "TABLE_A")
public class A implements Serializable {
@Id
@Column(name = "STR_ID")
private String strId;
@Id
@Column(name = "INT_ID")
@GeneratedValue(strategy = GenerationType.TABLE)
private Integer intId;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "a")
private List<B> bs;
public A(String strId) {
this.strId = strId;
}
public void addB(B b) {
if (bs == null) {
bs = new ArrayList<B>();
}
b.setA(this);
bs.add(b);
}
}
@Entity
@Table(name = "TABLE_B")
public class B implements Serializable {
@Id
@Column(name = "INT_ID")
@GeneratedValue(strategy = GenerationType.TABLE)
private Integer intId;
@Id
@ManyToOne
@JoinColumns({
@JoinColumn(name = "A_STR_FK", referencedColumnName = "STR_ID"),
@JoinColumn(name = "A_INT_FK", referencedColumnName = "INT_ID")
})
private A a;
void setA(A a) {
this.a = a;
}
}
是的,这是可能的,但到目前为止你尝试了什么?我尝试过使用自定义saveOrUpdate事件监听器,使用我的DAO中的拦截器和AOP。谢谢你的回复。在我的例子中,B变为:
public class B{private String strId;//一个外键private Integer intId;//一个外键private Integer intIdB;}
A的复合外键是由Hibernate自动创建的,因为我用@Id注释了manytone映射,此外键的字段也将用于B的复合主键。太棒了!你的代码工作得很好。但如果我只想保存B,我需要创建B并为设置主键创建A!我不知道为什么Hibernate不能设置引用(@OneToMany parent to child)如果字段是复合id(@EmebedId annotation),如果B的主键包含a的外键,那么B的实例在没有a实例的情况下永远不应该存在!如果这确实是您想要的,那么您的数据模型是不符合逻辑的,您可能应该为B的主键和A的外键使用不同的列(即使它们包含相同的值)
@Entity
@Table(name = "TABLE_B")
public class B implements Serializable {
@Id
@Column(name = "INT_ID")
@GeneratedValue(strategy = GenerationType.TABLE)
private Integer intId;
@Id
@ManyToOne
@JoinColumns({
@JoinColumn(name = "A_STR_FK", referencedColumnName = "STR_ID"),
@JoinColumn(name = "A_INT_FK", referencedColumnName = "INT_ID")
})
private A a;
void setA(A a) {
this.a = a;
}
}