2016-02-18 4 views
0

Я работаю над одним демо-проектом, в котором есть драйвер и лицензии, связанные с ManyToMany. У водителя может быть больше лицензий, и одна лицензия может быть подключена к большему количеству драйверов. Это не водительская лицензия. Лицензия, о которой я говорю, связана с грузом, который они могут или не могут транспортировать. Так оно и должно быть. Недавно у меня был запрос на добавление двух дополнительных полей в этом соединении. Драйвер и лицензия подключены ManyToMany по таблице Drivers_License. Эта дополнительная подача идет на Drivers_License, и это expirationDate и stateIssued.Spring hibernate ManyToMany с дополнительными полями

Теперь это вид моей базы данных.

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

Проблема в том, что мне нужно разорвать соединение ManyToMany и создать два соединения OneToMany. Мне также нужен составной ключ из идентификатора driverID и licenseID.

Это пример того, о чем я говорю. Hibernate Many-to-Many Association with Extra Columns in Join Table Example

Можете ли вы сказать мне, если есть полный пример, как закончить это с помощью пружины и спящий режим, или, может быть, вы знаете, некоторые примеры, которые могут справиться с этим с помощью ManyToMany по классическому пути?

+0

У вас есть контроль над таблицами или схема, сгенерированная из объектов? –

+0

Схема генерируется над объектами. –

+0

Прохладный. Тогда почему бы просто не разместить новые два новых поля в объекте лицензии? –

ответ

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, они обычно создаются автоматически поставщиком инерционности.

licenses список в таблице Driver будет относиться к join table, который будет содержать много лицензий для одного водителя, следовательно OneToMany отношения.

EDIT: Если у вас есть специальная лицензия и хотите узнать, какой драйвер он принадлежит, скажем, потому что вы смотрели его по имени, то вы должны добавить ссылку обратно к водителю:

@ManyToOne 
private Driver driver; 

Это будет ManyToOne, потому что у вас будет много лицензий, которые относятся к одному драйверу. В этой связи будет использоваться тот же Join Table, что и список licenses в Driver. Это также создаст круглую ссылку, Driver относится к License и License относится к Driver. Сначала вам нужно создать 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 выход и играть с приложением немного, чтобы получить ощущение того, что он может сделать, и как он это делает. Видение всего в действии поможет вам лучше понять, как это работает. Обычно я делаю простую веб-страницу с такими кнопками, как создание, печать, удаление и т. Д. И просмотр вывода отладки.

+0

Хорошо. Это выглядит великолепно. Вы пишете драйвер вместо лицензии во втором объекте. –

+0

Хорошо ли иметь лицензию в таблице Драйв, которая может быть сериализованным массивом идентификаторов лицензии? Это в случае, если у водителя больше лицензий. Это лицензии на грузовые перевозки, которыми он управляет. –

+0

Я просто не знаю, как организовать таблицы базы данных. Я думал, что дата истечения срока действия и выданный статус должны принадлежать Водителю. –

0

Хорошо. Как я и обещал, это мое решение. Николас помог мне решить некоторые проблемы в моей организации Entity и многое другое.

Для моей конкретной задачи я выбрал это: http://www.codejava.net/frameworks/hibernate/hibernate-many-to-many-association-with-extra-columns-in-join-table-example

Это решает работать с Hibernate. Я также использовал DTO для переупаковки бобов. Этот пример здесь имеет одну ошибку, и это значит, что они не используют LAZY в создании составных идентификаторов. Вот почему этот пример имеет проблему с бесконечным циклом.

Вот мой код, который решает это.

Driver объект

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

Спасибо, Ник! Вы помогли мне понять концепцию Сущности и многое другое. Стиль новый для всего этого.

Смежные вопросы