मैं दृढ़ता प्रदाता के रूप में हाइबरनेट उपयोग कर रहा हूँ और जेपीए 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);
}
मैं बहुत मदद करने के लिए आसान है, तो आप संबंधित डीबी स्कीमा प्रदान करते हैं और अपनी कक्षाओं की @Table एनोटेशन निर्दिष्ट कर सकते हैं होगा। – Osw
मेरे प्रश्न के अंत में पोस्ट किया गया। आदाब अर्ज है। – mkuff