Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 休眠保存集合_Java_Hibernate_Hibernate Mapping - Fatal编程技术网

Java 休眠保存集合

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

我正在使用Hibernate4(与Spring一起)将我的对象持久化到数据库中。 当我尝试用集合子对象保存父对象时,出现了一些问题

我的桌子:

| 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;
    }
}