EJB 3, JPA (Hibernate 3.x) - Designfrage

DerGrinsemann

Mitglied
Hallo!

Ich habe folgende Entity die eine Telefonnummer repräsentiert:

Code:
@Entity
@Table(name="Communication")
public class Communication {
 ...

    @Column(length=25, nullable=true, unique=false)
    private String prefixNumber = null;
    
    @Column(length=25, nullable=false, unique=false)
    private String mainNumber = null;
    
    @Column(length=25, nullable=true, unique=false)
    private String extensionNumber = null;

    // ... Getter und Setter

Ich möchte aber mittels Teilbereich über die ganze Telefonnummer suchen. Mein erster Ansatz war folgende Ergänzung vorzunehmen:

Code:
    @Column(name="fullNumber", length=75, nullable=false, unique=false)
    private String fullNumber = null;

    public String getFullNumber() {
	return fullNumber;
    }

    private void buildFullNumber() {
	this.setFullNumber(
		StringUtils.defaultString(this.prefixNumber) + 
		StringUtils.defaultString(this.mainNumber) + 
		StringUtils.defaultString(this.extensionNumber)
		);
    }

    private void setFullNumber(String fullNumber) {
	this.fullNumber = StringUtils.trimToNull(fullNumber);
    }

und

Code:
    public void setPrefixNumber(String prefixNumber) {
		this.prefixNumber = StringUtils.trimToNull(prefixNumber);
		this.buildFullNumber();
    }

ABER ... dieser Ansatz widerspricht der Aussage Entities sollen einfache POJOs sein und keine fremde Bibliotheken einbinden.

Welchen Ansatz würdet ihr verfolgen?

Marco
 
Ob deine Entity Referenzen auf andere Bibliotheken haben kann/darf ist erstmal grundsätzlich deine Sache. Eine Lib wie commons-lang kann man sicher referenzieren, da sie einen recht dünnen Layer über die JRE legen. Allerdings ist es sicher richtig, darauf zu achten, keine unnötigen Dependencies zu haben.

Für so eine einfache Stringoperation würde ich allerdings keine Property vorhalten sondern diese einfach bei jedem Aufruf mit einem Stringbuilder zusammenbauen. Desweiteren bin ich der Meinung, dass deine Telefonnummer keine Entity ist, sondern eher dem Valueobject Pattern (http://stackoverflow.com/questions/75446/value-vs-entity-objects-domain-driven-design) entspricht und somit eher als @Embeddable abzubilden ist.

Gruß
Ollie
 
Hallo Ollie!

Danke für deine Antwort!

Bzgl. @Embeddable würde ich dir bei einer klassischen Verwendung (z.B. Adressbuch) sofort zustimmen. Bei meinem Fall ist es ganz bewusst ein @Entity - der Unterschied ist mir bewusst!

Bzgl. Aufruf / Stringbuilder:

prefixNumber = "1234"
mainNumber = "5678"
extensionNumber="9"

Jetzt muss/möchte ich z.B. folgendes HQL absetzen

Code:
from Communication where Communication.fullNumber like '%3456%'

Also den Teilbereich "3456" über die komplette Telefonnummer - "34" ist Teil der Vorwahl usw.

Daher meine Idee eines eigenen Properties. Für andere Ideen habe ich ein offenes Ohr :)

Grüße aus Wien
Marco
 
Zuletzt bearbeitet:
Zurück