【问题标题】:Implement one-to-one relationship in java在java中实现一对一的关系
【发布时间】:2018-04-13 14:06:01
【问题描述】:

我想出了一个例子来演示 Employee 类和 EmployeeDetail 类之间的一对一关系:

public class Employee {

    private Long empId;
    private String name;
    private EmployeeDetail employeeDetail;

    //gettter and setter

}

public class EmployeeDetail{

    private Long empDetailsId;
    private String empFullName;
    private String empMailId;

    private Employee employee;

    //getter and setter..
}

在 Employee 类中,有一个 EmployeeDetail 字段,在 EmployeeDetail 类中,有一个 Employee 字段。我知道每个员工都有自己的 EmployeeDetail 并且每个 EmployeeDetail 只属于一个员工,但有两点让我感到困惑:

  1. 如果两个或多个员工具有相同的 EmployeeDetail(反之亦然)怎么办?有没有办法在 Java 代码中处理这个问题,或者我只能在关系数据库管理系统中这样做?

  2. 在 SQL 中,外键 (ID) 表示两个表之间的关系,但在上面的示例中,它们使用类对象代替。请帮我解释一下

【问题讨论】:

标签: java foreign-keys


【解决方案1】:
  1. one-to-one 关系中,EmployeeDetail 只能属于一个Employee。如果EmployeeDetail 应该能够属于多个Employees,则需要Many-to-one 关系(许多员工到一个员工详细信息)。

  2. 类对象记下外键的原因是,这很可能是Hibernate 示例,它使用Java Objects 进行数据库管理。 (即使它错过了一些清晰的Hibernate 示例的注释)

Here你可以找到一个关于Hibernate和数据库关系的例子

【讨论】:

    【解决方案2】:

    看看这个前任:

      @Entity
    @Table(name="d_agent_auth")
    public class AgentAuth implements Serializable {
    
        private static final long serialVersionUID = 1L;
        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        private int idAuth;
        @NotNull
        private String password;
        private Date dateCreation;
    
        @OneToOne
        @JoinColumn(name="code_agent")
        private Agent agent;
    
        public AgentAuth() {
            super();
        }
    }
    

    有两种方法,一种是可导航的,一种是两种感觉,这意味着在 agent 类中您将找不到关键参考 agentAuth 或两种感觉意味着在 agent 中您会找到它:

    @Entity
    @Table(name="d_agent")
    public class Agent implements Serializable {
        private static final long serialVersionUID = 1L;
        @Id
        private String codeAgent;
    
        @ManyToMany(mappedBy="DAgents", cascade=CascadeType.MERGE)
        private List<Profil> profil;
    
        @OneToMany(mappedBy="DAgent")
        private List<SuiviDossier> DSuiviDossiers;
    
        @OneToMany(mappedBy="DAgent")
        private List<SuiviLot> suiviLots;
    
        @OneToMany(mappedBy="agent")
        private List<Affectation> affecter;
    
        public Agent() {
            super();
        }
    }
    

    【讨论】:

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