2009-11-07 1 views
2

현재 시작하려고하는 부수 프로젝트에 사용할 OR 매퍼를 찾고 있습니다. 우리가 직장에서 사내에서 개발 한 OR 매퍼를 사용하고 있기 때문에 나는 다른 매퍼가 어떻게 작동하는지에 대해 많이 알지 못한다. (그리고 불완전한 그림이 존재한다.) 몇 가지 연구를 한 후 NHibernate, Linq-to-SQL 및 Entity Framework가 가장 보편적으로 사용되는 것으로 보인다.어떤 OR 매퍼가 같은 테이블간에 일대 다 AND 일대일 관계를 허용합니까?

여기 내 질문이 있습니다. [좋아하는 ORM 삽입]에서 동일한 테이블간에 일대 다 및 일대일 관계를 매핑 할 수 있습니까? 과 어떻게 (우아하게) 완료됩니까? 간단한 예제는 항목 목록 (일대 다)과 선택한 항목 (일대일)을 저장하는 것입니다.

내가이 특정 질문을 선택한 이유는 우리의 사내 OR-mapper와는 근본적으로 다르다는 것입니다. 단지 두 테이블 사이에 둘 이상의 관계를 허용하지 않습니다. 내가 이것을 묻는 것으로부터 얻고 자하는 것은 mappers와 함께 일하는 사람들로부터 통찰력을 얻고 싶습니다. (어떤 기존의!) OR-mapper를 사용하여 내 프로젝트에 사용할 것인지 결정할 수 있습니다.

도움 주셔서 감사합니다.

답변

1

나는 대부분의 ORM이 그런 매핑을 지원한다고 생각한다. (예외는 오직 Subsonic이다.) 예를 들어 DataObjects.Net의 경우 다음과 같이 표시됩니다.

public class ItemStore : Entity 
{ 
    [Field, Key] 
    public int Id { get; set; } 

    [Field] 
    public Item SelectedItem { get; set; } 

    [Field, Association(PairTo = "Store")] 
    public EntitySet<Item> Items { get; private set; } 
} 

public class Item : Entity 
{ 
    [Field, Key] 
    public int Id { get; set; } 

    [Field] 
    public ItemStore Store { get; set; } 
} 
+0

답변 해 주셔서 감사합니다! 그러나 볼 수있는 것은 일대 다 매핑입니다. 선택한 항목 (일대일) 매핑이 누락 된 것처럼 보입니다. 또는 나는 무엇인가 내려다보고 있냐? – andyp

+1

좋아, 모델을 업데이트했습니다. 나는 당신의 모범을 분명히 이해하지 못했던 것 같습니다. –

+0

위대한, 그 분명히하기위한 많은 감사합니다! – andyp

0

두 개의 테이블이있는 경우 하나는 List 용이고 하나는 ListItem 용입니다. ListItems에는 Lists에 대한 외래 키가 있고 List에는 선택한 항목에 대한 ListItems에 대한 외래 키가 있습니다.

이것은 매우 간단한 관계이며 모든 OR 매핑 도구에서 지원되어야합니다.

+0

데이터베이스 테이블에 매핑하는 방법을 알고 있습니다. 나는 그것이 다른 OR 매퍼에서 어떻게 이루어 졌는지에 대해서만 관심이 있습니다. 미안하지만, 내 질문에 그 부분에 대해 더 분명히 했어야했다. 그러나 어쨌든 귀하의 답변 주셔서 감사합니다! – andyp

1

OR 매퍼의 목적은 데이터베이스를 개체 그래프에 일치시키는 것입니다. 내가 확신

//table schema: 
// item_store(item_store_id, selected_item_id) 

@Entity 
@Table(name="item_store") 
class ItemStore { 
@Id 
@Column(name="item_store_id") 
public String getId() {...} 

@OneToMany(mappedBy="itemStore") 
public Collection<Item> getItems() {...} 

@ManyToOne 
@JoinColumn(name="selected_item_id") 
public Item getSelectedItem() {...} 
} 

//table schema: 
// item(item_id, item_store_id) 

@Entity 
@Table(name="item") 
class Item { 
@Id 
@Column(name="item_id") 
public String getId() {...} 

@ManyToOne 
@JoinColumn(name="item_store_id") 
public ItemStore getItemStore() {...} 
} 

(I 더 많거나 NHibernate에 덜 동일 최대 절전 모드를 사용하지만/NET 대신 C#을 자바에있어 여기.) : 그래서 당신이 설명하는 협회처럼 보일 수 있습니다 여기 어딘가에서 실수 나 두 가지를 만들었지 만 어떻게 작동하는지 잘 알 수 있습니다.

+1

"@"기호는 Java 주석 메타 데이터입니다. NHibernate와 동등한 기능은 NHibernate.Mapping.Attributes add-in에 Attributes를 사용하는 것입니다 : https://www.hibernate.org/hib_docs/nhibernate/1.2/reference/en/html_single/#mapping-attributes (기본 접근법에서는 XML 매핑 파일, 주석 달기가 더 쉽기 때문에 주석을 선호한다. 컴파일러가 검사하고 코드가 더 가깝기 때문에) – RMorrisey

+0

네, 주석을 알고 있습니다. 몇 년 전에 대학에서 자바를 사용해 봤습니다. 링크 주셔서 감사합니다! 그리고 속성을 사용하는 것이 XML 매핑을 사용하는 것보다 훨씬 낫다는 것에 동의합니다. – andyp

+0

NHibernate가 아주 좋아 보인다! 몇 주 전에 플레이어와 조금 씩씩하고 (특히 FluentNHibernate를 사용할 때) 많이 좋아한다고 인정해야합니다. – andyp

관련 문제