Java 如何映射具有双向关系的三元日期映射?

Java 如何映射具有双向关系的三元日期映射?,java,database,hibernate,collections,orm,Java,Database,Hibernate,Collections,Orm,我已经读过了:但我有一个问题的反面,我有地图的值组件作为日期。我应该如何绘制这张地图?地图:Map你能举一个包含俱乐部课程代码的例子吗?应该注意的是,这是一个三元映射。我不确定这是否重要,但Club和Clubber也有双向manytomy关系。我最初的猜测是: public class Clubber{ @Id @Column(name = "Clubber_Id") private final int id; @Temporal(TemporalType.TIMESTA

我已经读过了:但我有一个问题的反面,我有
地图的值组件作为日期。我应该如何绘制这张地图?地图:
Map
你能举一个包含俱乐部课程代码的例子吗?应该注意的是,这是一个三元映射。我不确定这是否重要,但
Club
Clubber
也有双向
manytomy
关系。我最初的猜测是:

public class Clubber{
   @Id
   @Column(name = "Clubber_Id")
   private final int id;
   @Temporal(TemporalType.TIMESTAMP)
   @ElementCollection
   @MapKeyJoinColumn(name = "id")
   private final Map<Club, Date> joinDate;
   @ManyToMany(cascade = CascadeType.ALL)
   private final Collection<Club> clubs;
}

public class Club {
   @Id
   @Column(name = "Club_ID")
   private final int id;
   @ManyToMany(cascade = CascadeType.ALL, mappedBy = "clubs")
   private final Collection<Clubber> clubbers;
}

当我将一个
@Transient
添加到
Clubber
joinDate
时,异常消失。

实际上,异常告诉我,在保存
Clubber
对象列表时(集合Clubber)不会被保存。保存俱乐部的代码,在保存
Club
之前,您必须将每个
Clubber
保存在其中,然后为
Club
调用
save


application@Transient annotation用于指示不在数据库中持久化字段。这就是为什么在应用
@Transient

后不会出现异常。这就是实体的外观:

@Entity(name = "Clubber")
public class Clubber{

    @Id
    @GeneratedValue
    @Column(name = "Clubber_Id")
    private Integer id;

    @Temporal(TemporalType.TIMESTAMP)
    @ElementCollection
    @CollectionTable(name="CLUB_ASSIGNMENTS", joinColumns=@JoinColumn(name="Clubber_Id", referencedColumnName="Clubber_Id"))
    @Column(name="CLUB_DATE")
    @MapKeyJoinColumn(name = "Club_ID", referencedColumnName="Club_ID")
    private Map<Club, Date> joinDate = new HashMap<>();

    public Integer getId() {
        return id;
    }

    public Map<Club, Date> getJoinDate() {
        return joinDate;
    }

    public Collection<Club> getClubs() {
        return joinDate.keySet();
    }

    public void addClub(Club club) {
        joinDate.put(club, new Date());
        //clubs.add(club);
        club.getClubbers().add(this);
    }
}

@Entity(name = "Club")
public class Club {

    @Id
    @GeneratedValue
    @Column(name = "Club_ID")
    private Integer id;

    @ManyToMany(mappedBy = "joinDate", cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    private List<Clubber> clubbers = new ArrayList<>();

    public Integer getId() {
        return id;
    }

    public List<Clubber> getClubbers() {
        return clubbers;
    }
}
这是您将
俱乐部会员
俱乐部
关联的方式:

final Clubber clubberReference = doInTransaction(session -> {
    Clubber clubber = new Clubber();
    Club club = new Club();
    clubber.addClub(club);
    session.persist(club);
    return clubber;
});

doInTransaction(session -> {
    Clubber clubber = (Clubber) session.get(Clubber.class, clubberReference.getId());
    assertEquals(1, clubber.getClubs().size());
    assertEquals(1, clubber.getJoinDate().size());
});
我在上创建了一个测试来检查这一点,它可以工作:

insert into Club (Club_ID) values (default)
insert into Clubber (Clubber_Id) values (default)]
insert into CLUB_ASSIGNMENTS (Clubber_Id, Club_ID, CLUB_DATE) values (1, 1, '2015-06-10 16:37:36.487')

那你想要什么?你想知道为什么会出现这种异常,以及如何解决它或其他问题吗?@A是的,如何解决它。你能在保存
俱乐部
的地方发布代码块吗?@A已更新。我认为保存应该是级联的,所以保存
俱乐部应该足够好,但事实并非如此。你看过我给出的文章了吗?尝试实现那篇文章中描述的保存逻辑,我认为这可以解决您的问题。@a听起来我应该在某个地方添加一个
@Cascade
。您可以发布如何更改注释的代码吗?或者我只需要手动保存每个
俱乐部成员
?@SarahSzabo是的,您可以执行级联插入,因为您已经添加了
@ManyToMany(cascade=CascadeType.ALL)
。这就是为什么我要求更新您用于保存俱乐部的代码,但没有更新问题。无论如何,看看这个例子,看看有多少双向的
@manytomy
create table CLUB_ASSIGNMENTS (Clubber_Id integer not null, CLUB_DATE timestamp, Club_ID integer not null, primary key (Clubber_Id, Club_ID))
create table Club (Club_ID integer generated by default as identity (start with 1), primary key (Club_ID))
create table Clubber (Clubber_Id integer generated by default as identity (start with 1), primary key (Clubber_Id))
alter table CLUB_ASSIGNMENTS add constraint FK_i1d8m16i8ytv7jybg8aneo9hj foreign key (Club_ID) references Club
alter table CLUB_ASSIGNMENTS add constraint FK_6oitm1mry43ga5iovtfamp3q3 foreign key (Clubber_Id) references Clubber
alter table CLUB_ASSIGNMENTS add constraint FK_3xj613grja6o0xkjeb7upms4 foreign key (CLUB_DATE) references Club
final Clubber clubberReference = doInTransaction(session -> {
    Clubber clubber = new Clubber();
    Club club = new Club();
    clubber.addClub(club);
    session.persist(club);
    return clubber;
});

doInTransaction(session -> {
    Clubber clubber = (Clubber) session.get(Clubber.class, clubberReference.getId());
    assertEquals(1, clubber.getClubs().size());
    assertEquals(1, clubber.getJoinDate().size());
});
insert into Club (Club_ID) values (default)
insert into Clubber (Clubber_Id) values (default)]
insert into CLUB_ASSIGNMENTS (Clubber_Id, Club_ID, CLUB_DATE) values (1, 1, '2015-06-10 16:37:36.487')