사용

2010-05-27 7 views
2

내가 확실히 작동하지 수 JPA에 새로 온 사람과 어쨌든 자바 지속성을 사용하고 난 두 가지 질문이 있습니다사용

@JoinColumn(name = "UserName", referencedColumnName = "UserName") 
@ManyToOne(optional = false) 
private User userName; 
@JoinColumn(name = "DatasetNo", referencedColumnName = "DatasetNo") 
@ManyToOne(optional = false) 
private Dataset datasetNo; 

그러나에 : 나는 같은 태그를 생성 한 클래스의 생성자 중 하나 인 경우 UserName 또는 DatasetNo 열은 참조되지 않지만 클래스의 다른 모든 열은 생성자에서 참조됩니다.

아무도 왜 이것이 내게 말할 수 있습니까? UserName과 DatasetNo 열은 모두 동일한 이름의 데이터베이스 테이블에 해당하는 엔터티 Visualization의 '외래 키'입니다. 나는 ORM을 해결할 수 없다.

그리고 엔티티 클래스를 사용하거나 POJO 때, 같은 클래스 변수가하는 것이 좋습니다 :

개인 사용자 아이디;

클래스의 인스턴스가 지정되거나

단순히 클래스 인스턴스 등의 키를

개인 문자열 사용자 이름 :

감사합니다.

Mr Morgan.

답변

2

생성자가 작성된 방식은 스키마에서 클래스를 생성하는 데 사용한 자동 생성 도구 중 하나의 기능입니다. 그것들을 가져 오는 생성자를 원한다면 자유롭게 추가하십시오. 어떤 도구를 사용했는지 그리고 왜 그렇게 작동하는지에 대한 설명을 어떻게 구성했는지 알아야합니다 :)

실제 개체 관계를 매핑하는 것이 일반적으로 선호됩니다. 그것이 ORM 애프터 럴의 전체 요점입니다. 사용 가능한 비즈니스 객체로 추가 조작이 필요한 벙어리 구조체가 아니라 데이터베이스에있는 객체에 매핑되는 실제 사용 가능한 도메인 객체를 갖기. 또한 객체 쿼리를 현명하게 작성할 수 있기를 원할 경우에도 필요합니다.

는 작성하기가 훨씬 더 좋네요 :

Select roles from UserRoles roles where role.user.isAdmin = true 

그것은 또한 실제 개체의 관계를 바인딩보기 도움이 될 수있는 디스플레이 기술에 따라

Select roles from UserRules roles join Users u on roles.userName = u.userName where u.isAdmin = true 

보다.

자동 생성 도구에서 생성 한 속성 이름도 임의적입니다. 열 이름과 일치 할 필요는 없습니다.

public User getUserName()은 사실 다소 어리 석다.
당신은 확실히 엔티티 공용 또는 보호 된 인수 없음의 생성자가 있어야합니다, 사양에 따라, 우선 public User getUser()

+0

감사합니다. 객체 참조를 제자리에두면 행복합니다. 즉 개인 Dataset 데이터 세트입니다. 하지만 아마도 JPA 태그 대신 POJO를 사용할 것입니다. ORM을 직접 작성해야한다는 의미 일지라도 - 이전에 JPA에 불행했습니다. Prepared Statements를 사용하는 손으로 쓰는 ORM 코드는 너무 번거롭지 않을 것입니다. 다른 시스템 테이블은 다양한 속성 수를 사용하여 동적으로 작성되므로 JPA를 사용하면 어 @ 것도 가능하지 않습니다. –

1

으로 변경할 수 있습니다. 에는 다른 생성자가있을 수 있지만 JPA는 상관하지 않으므로 아무 인자도없는 생성자를 제공하는 한 원하는대로 추가 할 수 있습니다.

둘째, ORM으로 작업 할 때 "열과 외래 키를 잊어 버리고"개체와 연결을 생각하면 ORM이 외래 키와 조인을 처리합니다.

그래서 실제로이 같은 것을 볼 기대 :

@JoinColumn(name = "UserName", referencedColumnName = "UserName") 
@ManyToOne(optional = false) 
private User user; 
@JoinColumn(name = "DatasetNo", referencedColumnName = "DatasetNo") 
@ManyToOne(optional = false) 
private Dataset dataset; 

의 차이는 통신 것에하지만 근본적인 (차이가 기술적으로 없다 ERF)의 뭉입니다 : 당신 실체의 속성은 외래 키하지 않습니다 다른 개체들 (그러므로 생각하는 개체와 연관들)의 인스턴스.

JPQL을 사용하여 쿼리를 작성할 때도 마찬가지입니다. 당신은 사물을 생각하고 협회를 탐색해야합니다. 예를 들어, JPQL에서의 UseruserName를 검색하기 위해 주어진 ... 음, 여기 UserDataset을 들고 Foo 엔티티를 부르 자 : 답변에 대한

select f.user.userName from Foo f where f.id = :id