【问题标题】:How to create ManyToOne relationship using JPA Hibernate annotation?如何使用 JPA Hibernate 注释创建多对一关系?
【发布时间】:2017-03-30 12:16:57
【问题描述】:

我有两个 POJO 类,分别命名为 Task 和 Team。一个团队可以对应多个任务,但每个任务只能映射一个团队。

// Task POJO
@Entity
@Table(name = "Task")
public class Task extends Domain implements Serializable {

@GeneratedValue(strategy = GenerationType.AUTO)
@Id
private Long taskId;

//Mapping To Team 
@ManyToOne
@JoinColumn(name="teamId")
private Team teamId;

POJO 团队

@Entity
@Table(name = "Team")
public class Team extends Domain implements Serializable {

@GeneratedValue(strategy = GenerationType.AUTO)
@Id
private Long teamId;
@Column(nullable = false)

@OneToMany(mappedBy="teamId")
private List<Task> task = new ArrayList<Task>();

问题是我无法映射/保存/更新,这并没有影响我的 Pojo 团队。

  //Task Table
  +-----------------+--------------+------+-----+---------+----------------+
  | Field           | Type         | Null | Key | Default | Extra          |
  +-----------------+--------------+------+-----+---------+----------------+
  | taskId          | bigint(20)   | NO   | PRI | NULL    | auto_increment |
  | taskName        | varchar(255) | NO   |     | NULL    |                |
  | teamId          | bigint(20)   | YES  | MUL | NULL    |                |
  +-----------------+--------------+------+-----+---------+----------------+

团队表

 +----------+--------------+------+-----+---------+----------------+
 | Field    | Type         | Null | Key | Default | Extra          |
 +----------+--------------+------+-----+---------+----------------+
 | teamId   | bigint(20)   | NO   | PRI | NULL    | auto_increment |
 | teamName | varchar(255) | NO   |     | NULL    |                |
 +----------+--------------+------+-----+---------+----------------+

那么我如何映射这两个 Pojo 类并在保存/删除表中的数据时产生影响。

提前致谢。

【问题讨论】:

  • 您使用的是什么 DBMS?
  • @YCF_L 我正在将 My-SQL 与 JPA 和 Spring 一起使用

标签: java mysql hibernate jpa javabeans


【解决方案1】:

我发现您在一对多关联属性(任务)中定义了@Column,我认为这是类型错误。

对于双向一对多关联,更新关系的一侧,另一侧也应该得到更新,并保持同步。下面展示了如何使两个实体同步:

@Entity
@Table(name = "Task")
public class Task extends Domain implements Serializable {

    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    private Long taskId;

    //Mapping To Team 
    @ManyToOne
    @JoinColumn(name="teamId")
    private Team team;

    public void setTeam(Team team) {
        this.team = team;
        if (!team.getTasks().contains(this)) { 
            team.getTasks().add(this);
        }
    }

}

@Entity
@Table(name = "Team")
public class Team extends Domain implements Serializable {

    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    private Long teamId;
    @Column(nullable = false)

    @OneToMany(mappedBy="team")
    private List<Task> tasks = new ArrayList<Task>();

    public void addTask(Task task) {
        this.tasks.add(task);
        if (task.getTeam() != this) {
            task.setTeam(this);
        }
    }
}

【讨论】:

    【解决方案2】:

    @OneToMany(mappedBy="teamId", cascade=CascadeType.ALL),尝试在Team类的成员(属性)任务上方添加这个注解

    【讨论】:

    【解决方案3】:

    通过在 Team 实体中添加引用的列来完成您在 Task 实体中的 @manyToOne 映射;并将成员命名为“团队”,而不是“团队 ID”,即:

    @ManyToOne
    @JoinColumn(name="teamId",
       referencedColumnName="teamId")
    private Team team;
    

    要总体了解 JPA 中的关系映射,请参阅:https://en.wikibooks.org/wiki/Java_Persistence/Relationships#Nested_Collections.2C_Maps_and_Matrices

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多