2011-01-16 16 views
12

मैं दृढ़ता प्रदाता के रूप में हाइबरनेट उपयोग कर रहा हूँ और जेपीए 2.जेपीए 2: विदेशी कुंजी

के साथ मेरी संस्थाओं मॉडलिंग में एक से अधिक स्तंभ उपयोग अब एक सवाल आया और मैं तुम मेरी मदद कर सकते हैं उम्मीद है।

मेरे आवेदन में आप एक गेम खोल सकते हैं, इसमें खिलाड़ियों के समूह बना सकते हैं और मानचित्र (टाइलें (2 डी)) पर घूम सकते हैं।

सबसे पहले मेरी इकाई परिभाषाएँ: खेल:

@Entity 
public class Game implements Serializable { 
@Id 
@SequenceGenerator(name = "gen_gameid", sequenceName = "seq_gameid") 
@GeneratedValue(generator="gen_gameid") 
private long gameid; 

/** 
* Playing Characters. 
*/ 
@OneToMany(mappedBy = "game") 
private List<Character> characters; 
private int round = 0; 

@OneToMany(mappedBy="game") 
private List<Tile> tiles; 

@OneToMany(mappedBy="game") 
private List<Group> group; 

टाइल (एक टाइल एक टेम्पलेट से बनाया जाएगा और अंतर्गत आता है सिर्फ एक खेल):

@Entity @IdClass(TileId.class) 
public class Tile implements Serializable{ 
    private static final long serialVersionUID = 2039974286110729270L; 

    @Id 
    private int x; 

    @Id 
    private int y; 

    @Id @ManyToOne @JoinColumn(name="gameid") 
    private Game game; 

    @OneToOne(mappedBy="tile") 
    private Character character; 
} 

चरित्र:

@ManyToOne 
@JoinColumn(name="gameid", referencedColumnName = "gameid") 
private Game game; 

@ManyToOne 
@JoinColumns({ 
    @JoinColumn(name="groupgameid", referencedColumnName = "gameid"), 
    @JoinColumn(name="groupTag", referencedColumnName = "grouptag") 
}) 
private Group group; 

    @OneToOne 
    @JoinColumns({  
     @JoinColumn(name = "x", referencedColumnName = "x"), 
     @JoinColumn(name = "y", referencedColumnName = "y"), 
     @JoinColumn(name = "tilegameid", referencedColumnName = "gameid") 
    }) 
    private Tile tile; 

जैसा कि आप देख सकते हैं कि मुझे गेमिडेम और टाइलगाम में गेमिड कॉलम का नाम बदलना पड़ा ईद। यह बहुत सुंदर नहीं है क्योंकि मुझे सिर्फ एक बार चरित्र में गेमिड की आवश्यकता होगी। टाइल से समूह में एफके कॉलम को चिह्नित करने के लिए और सम्मिलनीय = झूठी, अद्यतन करने योग्य = झूठी एसक्यूएल पीढ़ी की अनुमति देगा, लेकिन मैं इस मान को बदल/सेट नहीं कर सकता।

निश्चित रूप से मैं समूह और टाइल में कृत्रिम पीके पेश कर सकता हूं, लेकिन मुझे और जुड़ने की आवश्यकता होगी।

क्या जेपीए बस इतना सीमित है कि मुझे अन्य नामों के साथ गेमिड कॉलम को एक से अधिक बार अनुमति देना है? या मेरा डिजाइन इष्टतम नहीं है?

आपकी प्रतिक्रिया के लिए तत्पर हैं और अग्रिम धन्यवाद। बधाई मार्कस

पी एस (संपादित): इस समय मैं शेमा स्टार्टअप पर हाइबरनेट द्वारा उत्पन्न अपने मॉडल पूरा हो गया है जब तक करते हैं।

CREATE TABLE Character 
(
    charid bigint NOT NULL, 
    gameid bigint, 
    grouptag character varying(255), 
    x integer, 
    y integer, 
    CONSTRAINT hero_pkey PRIMARY KEY (charid), 
    CONSTRAINT fkd4addb09308bc3b822441a FOREIGN KEY (gameid) 
    REFERENCES game (gameid) MATCH SIMPLE 
    ON UPDATE NO ACTION ON DELETE NO ACTION, 
    CONSTRAINT fkd4addb093091cb6522441a FOREIGN KEY (gameid, x, y) 
    REFERENCES tile (gameid, x, y) MATCH SIMPLE 
    ON UPDATE NO ACTION ON DELETE NO ACTION, 
    CONSTRAINT fkd4addb09c018f3ae22441a FOREIGN KEY (gameid, grouptag) 
    REFERENCES gamegroup (gameid, grouptag) MATCH SIMPLE 
    ON UPDATE NO ACTION ON DELETE NO ACTION 
) 

CREATE TABLE tile (
    x integer NOT NULL, 
    y integer NOT NULL, 
    gameid bigint NOT NULL, 
    CONSTRAINT tile_pkey PRIMARY KEY (gameid, x, y), 
    CONSTRAINT fk27c6ce308bc3b8 FOREIGN KEY (gameid) 
    REFERENCES game (gameid) MATCH SIMPLE 
    ON UPDATE NO ACTION ON DELETE NO ACTION) 

CREATE TABLE gamegroup 
(
    grouptag character varying(255) NOT NULL, 
    gameid bigint NOT NULL, 
    CONSTRAINT gamegroup_pkey PRIMARY KEY (gameid, grouptag), 
    CONSTRAINT fk3c1c51cd308bc3b8 FOREIGN KEY (gameid) 
    REFERENCES game (gameid) MATCH SIMPLE 
    ON UPDATE NO ACTION ON DELETE NO ACTION 
) 

पी एस 2: लेकिन यहाँ उत्पन्न शेमा (बिट सरलीकृत और कुछ महत्वहीन फ़ील्ड cutted) है मैं पहले से ही , insertable = false, updatable = false के साथ चारों ओर खेला। उदाहरण के लिए जब मैं करने के लिए समूह JoinColumns बदलने के लिए: की वजह से: org.hibernate.AnnotationException: एक संपत्ति में insertable और गैर insertable कॉलम मिश्रण की अनुमति नहीं है

@ManyToOne 
@JoinColumns({ 
    @JoinColumn(name="gameid", referencedColumnName = "gameid", insertable = false, updatable = false), 
    @JoinColumn(name="groupTag", referencedColumnName = "grouptag") 
}) 
private Group group; 

मैं एक त्रुटि है कि मिश्रण की अनुमति नहीं है मिल : net.hq.model.Charactergroup

जब मैं दोनों डालने योग्य = झूठी बना देता हूं तो मैं समूह टैग को और सेट करने में सक्षम नहीं हूं। प्रविष्टि और गेमिड सेट होने के बाद यह समूहटाग खाली रहता है। : -/

तरह से मैं एक समूह को एक चरित्र जोड़ें: समूह कक्षा में

// Create game 
Game game = new Game(); 
game.addCharacter(max); 
em.persist(game); 

// Group 
Group heroGroup = new Group(game, "HEROES"); 
heroGroup.addCharacter(max); 
em.persist(game); 

विधि:

public void addCharacter(Character character){ 
    if(this.characters == null) 
     this.characters = new ArrayList<Character>(); 

    this.characters.add(character); 
    character.setGroup(this); 
} 
+0

मैं बहुत मदद करने के लिए आसान है, तो आप संबंधित डीबी स्कीमा प्रदान करते हैं और अपनी कक्षाओं की @Table एनोटेशन निर्दिष्ट कर सकते हैं होगा। – Osw

+0

मेरे प्रश्न के अंत में पोस्ट किया गया। आदाब अर्ज है। – mkuff

उत्तर

3

क्या आप वाकई इन @JoinColumn रों लिए insertable = false, updateable = false उपयोग नहीं कर सकते हैं?

जहां तक ​​मैं समझता हूँ, आप gameid एक बार game संपत्ति की स्थापना द्वारा प्रारंभ कर सकते हैं, और उसके बाद आप के बाद से Tile और Group रों ही Game के हैं इसे बदलने की जरूरत नहीं है।

+0

हां यह सच है। लेकिन ऐसा लगता है कि मुझे JoinColums विशेषताओं को मिश्रण करने की अनुमति नहीं है। पीएस में स्पष्टीकरण 2. ग्रीटिंग्स – mkuff

7

आप ऐसा जरूरत है:

@ManyToOne 
@JoinColumns({ 
    @JoinColumn(name="gameid", referencedColumnName = "gameid", insertable = false, updatable = false), 
    @JoinColumn(name="groupTag", referencedColumnName = "grouptag", insertable = false, updatable = false) 
}) 
private Group group; 
+0

धन्यवाद सानमा ना, जिन्होंने मुझे वास्तव में करीब पाया। मुझे शामिल होने के बाद स्क्वायर ब्रैकेट का उपयोग करने के लिए बदलना होगा कॉलमोलम्स ने एक सरणी की उम्मीद की है। – bigMC28

संबंधित मुद्दे