有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Spring使用额外的字段让很多人冬眠

我正在做一个演示项目,它的驱动程序和许可证连接了很多。驾驶员可以拥有更多驾照,一个驾照可以连接到更多驾驶员。这不是驾驶执照。我所说的许可证与他们可以或不能运输的货物有关。应该是这样的。 最近,我有一个请求,在这个连接中添加两个额外的字段。驱动程序和许可证通过表Drivers\u License连接很多。额外的文件将被提交给驾照,即到期日,并由州政府颁发

这是我现在数据库的外观

Driver                          Driver_License                   License
-----------                     -------------------             --------------------
driverID                         driverID                         licenseID
driverName                       licenseID                        licenseName
driverNumber                     expirationDate    
driverDateOfBirth                stateIssued

问题是我需要断开多个连接,创建两个一个一个的连接。我还需要由driverID和licenseID制作的复合密钥

这就是我所说的例子。 Hibernate Many-to-Many Association with Extra Columns in Join Table Example

你能告诉我是否有一些完整的例子如何使用spring和hibernate来完成这项工作,或者你知道一些例子可以通过经典的方式使用ManyToMany来处理这个问题吗


共 (2) 个答案

  1. # 1 楼答案

    只要您自己创建模式,就不需要将字段添加到join table。只需将它们添加到您的许可证Entity。这将是一个近似的你似乎要做的事情

    @Entity
    public class Driver {    
        @Id @GeneratedValue private Integer id;
        @OneToMany private List<License> licenses;
        ... Driver Name, Number, & DateOfBirth ...
    }
    

    @Entity
    public class License {    
        @Id @GeneratedValue private Integer id;
        private String licenseName;
        // add your fields here.
        @Temporal(TemporalType.DATE)
        private Date expirationDate;
        private String issueState;
    }
    

    同样,您也不想弄乱join table,它们通常是由持久性提供程序自动创建的

    Driver表中的licenses列表将引用一个为一个驱动程序持有多个许可证的join table,因此是OneToMany关系

    编辑:如果你有一个特定的驾照,想知道它属于哪一个驾驶人,比如说因为你查了它的名字,那么你应该添加一个对该驾驶人的引用:

    @ManyToOne
    private Driver driver;
    

    这将是一个ManyToOne,因为您将拥有多个涉及一个驱动程序的许可证。此关系将使用与Driver中的licenses列表相同的Join Table。这也将创建一个循环引用,DriverLicenseLicenseDriver。您必须首先创建Licenses,保存它们,创建Driver,添加许可证,保存它,然后mergeDriver放入License

        for(License license: licenses) {
            em.persist(license);
        }
        Driver driver = new Driver();
        driver.getLicenses().add(licenses);
        em.persist(driver);
        // merge circular dependency
        for(License license: licenses) {
            license.setDriver(driver);
            em.merge(license);
        }
    

    好建议:你应该打开SQL输出,稍微玩一下应用程序,了解它能做什么,以及它是如何做的。看到每一件事都在起作用会帮助你更好地了解它是如何运作的。我通常用创建、打印、删除等按钮制作一个简单的网页,并观看调试输出

  2. # 2 楼答案

    好的。就像我承诺的,这是我的解决方案。尼古拉斯帮我解决了实体组织中的一些问题,还有更多问题

    对于我的特殊问题,我选择了这个:http://www.codejava.net/frameworks/hibernate/hibernate-many-to-many-association-with-extra-columns-in-join-table-example

    这解决了hibernate的工作问题。我还使用DTO重新包装豆子。这里的这个例子有一个错误,那就是他们没有在复合ID创建中使用LAZY。这就是为什么这个例子有无限循环问题

    这是我解决这个问题的代码

    驱动程序实体

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "id.driver", cascade = CascadeType.ALL)
    
     private List<DriverLicense> driverLicense = new ArrayList<DriverLicense>();
    
     public List<DriverLicense> getDriverLicense() {
       return driverLicense;
    
     public void setDriverLicense(List<DriverLicense> driverLicense) {
       this.driverLicense = driverLicense;
     }
    

    DriverLicenseID(我的复合密钥)

    @Embeddable
    public class DriverLicenseID implements Serializable { 
    
        private static final long serialVersionUID = 1L;
    
        @ManyToOne(fetch = FetchType.LAZY, cascade=CascadeType.ALL) 
        @JoinColumn(name="driverID")
        private Driver driver;
    
        public Driver getDriver() {
            return driver;
        }
    
        public void setDriver(Driver driver) {
            this.driver = driver;
        }
    
        @ManyToOne(fetch = FetchType.LAZY, cascade=CascadeType.ALL)
        private License license;
    
        public License getLicense() {
            return license;
        }
    
        public void setLicense(License license) {
            this.license = license;
        } 
    }
    

    许可证实体

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "id.license", cascade = CascadeType.ALL)
    
        private List<DriverLicense> driverLicense = new ArrayList<DriverLicense>();
    
        public List<DriverLicense> getDriverLicense() {
             return driverLicense;
        }
    
        public void setDriverLicense(List<DriverLicense> driverLicense) {
             this.driverLicense = driverLicense;
        }
    

    谢谢你,尼克!你们帮助我理解了实体的概念,还有更多。全新的风格