<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: Hibernate Naming Strategie für Oracle die zweite</title>
	<atom:link href="http://blog.schauderhaft.de/2008/03/29/hibernate-naming-strategie-fur-oracle-die-zweite/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.schauderhaft.de/2008/03/29/hibernate-naming-strategie-fur-oracle-die-zweite/</link>
	<description>Softwaredevelopment, Projectmanagement, Qualitymanagement and all things &#34;schauderhaft&#34;</description>
	<lastBuildDate>Tue, 07 Feb 2012 23:24:32 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
	<item>
		<title>By: Dominik S.</title>
		<link>http://blog.schauderhaft.de/2008/03/29/hibernate-naming-strategie-fur-oracle-die-zweite/comment-page-1/#comment-4845</link>
		<dc:creator>Dominik S.</dc:creator>
		<pubDate>Thu, 19 Jan 2012 14:41:21 +0000</pubDate>
		<guid isPermaLink="false">http://blog.schauderhaft.de/2008/03/29/hibernate-naming-strategie-fur-oracle-die-zweite/#comment-4845</guid>
		<description>Nochmals Nachtrag (bezieht sich auf meinen Post im anderen Blogeintrag zum Thema): Für mich stimmt’s wenn ich die Methode isMultipleUpperToLower in addUnderscores rausnehme. Ich habe das Ganze übrigens auf NHibernate und C# übertragen:


&lt;pre&gt;

    public class OracleNamingStrategy : INamingStrategy
    {
        public string ClassToTableName(string className)
        {
            return AbbreviateName(TableName(StringHelper.Unqualify(className)));
        }



        public string PropertyToColumnName(string propertyName)
        {
            return AbbreviateName(AddUnderscores(propertyName));
        }



        public string TableName(string tableName)
        {
            return AbbreviateName(AddUnderscores(tableName));
        }



        public string ColumnName(string columnName)
        {
            return AbbreviateName(AddUnderscores(columnName));
        }



        public string PropertyToTableName(string className, string propertyName)
        {
            string tableName = &quot;Lt&quot;;
            tableName += className.Substring(className.LastIndexOf(&quot;.&quot;)).Remove(0,1);
            tableName += propertyName.Substring(propertyName.LastIndexOf(&quot;.&quot;)).Remove(0,1);
            return AbbreviateName(AddUnderscores(tableName));
        }



        public string LogicalColumnName(string columnName, string propertyName)
        {
            return ColumnName(columnName) + &#039;_&#039; + PropertyToColumnName(propertyName);
        }

        


        private static string AddUnderscores(string name)
        {
            if (name == null)
                return null;
            StringBuilder buf = new StringBuilder(name.Replace(&#039;.&#039;, &#039;_&#039;));
            for (int i = 1; i &lt; buf.Length - 1; i++)
            {
                if ((IsLowerToUpper(buf, i)))
                {
                    buf.Insert(i++, &#039;_&#039;);
                }
            }
            return buf.ToString().ToLower();
        }

        

        private static bool IsMultipleUpperToLower(StringBuilder buf, int i)
        {
            return i &gt; 1 &amp;&amp; char.IsUpper(buf[i - 1])
                    &amp;&amp; char.IsUpper(buf[i - 2])
                    &amp;&amp; char.IsLower(buf[i]);
        }



        private static bool IsLowerToUpper(StringBuilder buf, int i)
        {
            return char.IsLower(buf[i - 1])
                    &amp;&amp; char.IsUpper(buf[i]);
        }

    

        private static int MAX_LENGTH = 30;



        public static string AbbreviateName(string someName)
        {
            if (someName.Length &lt;= MAX_LENGTH)
                return someName;



            string[] tokens = SplitName(someName);
            ShortenName(someName, tokens);



            return AssembleResults(tokens);
        }



        private static string[] SplitName(string someName)
        {
            string[] tokens = someName.Split(char.Parse(&quot;_&quot;));
            return tokens;
        }



        private static void ShortenName(string someName, string[] tokens)
        {
            int currentLength = someName.Length;
            while (currentLength &gt; MAX_LENGTH)
            {
                int tokenIndex = GetIndexOfLongest(tokens);
                string oldToken = tokens[tokenIndex];
                tokens[tokenIndex] = Abbreviate(oldToken);
                currentLength -= oldToken.Length - tokens[tokenIndex].Length;
            }
        }



        private static string AssembleResults(string[] tokens)
        {
            StringBuilder result = new StringBuilder(tokens[0]);
            for (int j = 1; j &lt; tokens.Length; j++)
            {
                result.Append(&quot;_&quot;).Append(tokens[j]);
            }
            return result.ToString();
        }



        private static string Abbreviate(string token)
        {
            string VOWELS = &quot;AEIOUaeiou&quot;;
            bool vowelFound = false;
            for (int i = token.Length - 1; i &gt;= 0; i--)
            {
                if (!vowelFound)
                    vowelFound = VOWELS.Contains(token[i].ToString());
                else if (!VOWELS.Contains(token[i].ToString()))
                    return token.Substring(0, i + 1);
            }
            return &quot;&quot;;
        }



        private static int GetIndexOfLongest(string[] tokens)
        {
            int maxLength = 0;
            int index = -1;
            for (int i = 0; i &lt; tokens.Length; i++)
            {
                string tString = tokens[i];
                if (maxLength &lt; tString.Length)
                {
                    maxLength = tString.Length;
                    index = i;
                }
            }
            return index;
        }



    }


&lt;/pre&gt;

Es hat darin noch eine kleine Modifikation: Collection tables werden bei uns mit einem vorangestellten “lt_” benannt.

Hoffe, das nützt jemandem.

&lt;b&gt;-- English summary:&lt;/b&gt;

I’ve translated the NamingStrategy for Oracle to NHibernate and C#. Small additions:
- I’m not using the IsMultipleUpperToLower() method in AddUnderscores() because I’m not happy with the result when there’s a bunch of consecutive uppercase characters present.
- We want our collection tables to be called lt_* so the above code reflects that.</description>
		<content:encoded><![CDATA[<p>Nochmals Nachtrag (bezieht sich auf meinen Post im anderen Blogeintrag zum Thema): Für mich stimmt’s wenn ich die Methode isMultipleUpperToLower in addUnderscores rausnehme. Ich habe das Ganze übrigens auf NHibernate und C# übertragen:</p>
<pre>

    public class OracleNamingStrategy : INamingStrategy
    {
        public string ClassToTableName(string className)
        {
            return AbbreviateName(TableName(StringHelper.Unqualify(className)));
        }

        public string PropertyToColumnName(string propertyName)
        {
            return AbbreviateName(AddUnderscores(propertyName));
        }

        public string TableName(string tableName)
        {
            return AbbreviateName(AddUnderscores(tableName));
        }

        public string ColumnName(string columnName)
        {
            return AbbreviateName(AddUnderscores(columnName));
        }

        public string PropertyToTableName(string className, string propertyName)
        {
            string tableName = "Lt";
            tableName += className.Substring(className.LastIndexOf(".")).Remove(0,1);
            tableName += propertyName.Substring(propertyName.LastIndexOf(".")).Remove(0,1);
            return AbbreviateName(AddUnderscores(tableName));
        }

        public string LogicalColumnName(string columnName, string propertyName)
        {
            return ColumnName(columnName) + '_' + PropertyToColumnName(propertyName);
        }

        private static string AddUnderscores(string name)
        {
            if (name == null)
                return null;
            StringBuilder buf = new StringBuilder(name.Replace('.', '_'));
            for (int i = 1; i &lt; buf.Length - 1; i++)
            {
                if ((IsLowerToUpper(buf, i)))
                {
                    buf.Insert(i++, '_');
                }
            }
            return buf.ToString().ToLower();
        }

        private static bool IsMultipleUpperToLower(StringBuilder buf, int i)
        {
            return i &gt; 1 &amp;&amp; char.IsUpper(buf[i - 1])
                    &amp;&amp; char.IsUpper(buf[i - 2])
                    &amp;&amp; char.IsLower(buf[i]);
        }

        private static bool IsLowerToUpper(StringBuilder buf, int i)
        {
            return char.IsLower(buf[i - 1])
                    &amp;&amp; char.IsUpper(buf[i]);
        }

        private static int MAX_LENGTH = 30;

        public static string AbbreviateName(string someName)
        {
            if (someName.Length &lt;= MAX_LENGTH)
                return someName;

            string[] tokens = SplitName(someName);
            ShortenName(someName, tokens);

            return AssembleResults(tokens);
        }

        private static string[] SplitName(string someName)
        {
            string[] tokens = someName.Split(char.Parse("_"));
            return tokens;
        }

        private static void ShortenName(string someName, string[] tokens)
        {
            int currentLength = someName.Length;
            while (currentLength &gt; MAX_LENGTH)
            {
                int tokenIndex = GetIndexOfLongest(tokens);
                string oldToken = tokens[tokenIndex];
                tokens[tokenIndex] = Abbreviate(oldToken);
                currentLength -= oldToken.Length - tokens[tokenIndex].Length;
            }
        }

        private static string AssembleResults(string[] tokens)
        {
            StringBuilder result = new StringBuilder(tokens[0]);
            for (int j = 1; j &lt; tokens.Length; j++)
            {
                result.Append("_").Append(tokens[j]);
            }
            return result.ToString();
        }

        private static string Abbreviate(string token)
        {
            string VOWELS = "AEIOUaeiou";
            bool vowelFound = false;
            for (int i = token.Length - 1; i &gt;= 0; i--)
            {
                if (!vowelFound)
                    vowelFound = VOWELS.Contains(token[i].ToString());
                else if (!VOWELS.Contains(token[i].ToString()))
                    return token.Substring(0, i + 1);
            }
            return "";
        }

        private static int GetIndexOfLongest(string[] tokens)
        {
            int maxLength = 0;
            int index = -1;
            for (int i = 0; i &lt; tokens.Length; i++)
            {
                string tString = tokens[i];
                if (maxLength &lt; tString.Length)
                {
                    maxLength = tString.Length;
                    index = i;
                }
            }
            return index;
        }

    }
</pre>
<p>Es hat darin noch eine kleine Modifikation: Collection tables werden bei uns mit einem vorangestellten “lt_” benannt.</p>
<p>Hoffe, das nützt jemandem.</p>
<p><b>&#8211; English summary:</b></p>
<p>I’ve translated the NamingStrategy for Oracle to NHibernate and C#. Small additions:<br />
- I’m not using the IsMultipleUpperToLower() method in AddUnderscores() because I’m not happy with the result when there’s a bunch of consecutive uppercase characters present.<br />
- We want our collection tables to be called lt_* so the above code reflects that.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Jens Schauder</title>
		<link>http://blog.schauderhaft.de/2008/03/29/hibernate-naming-strategie-fur-oracle-die-zweite/comment-page-1/#comment-148</link>
		<dc:creator>Jens Schauder</dc:creator>
		<pubDate>Sat, 07 Mar 2009 20:25:55 +0000</pubDate>
		<guid isPermaLink="false">http://blog.schauderhaft.de/2008/03/29/hibernate-naming-strategie-fur-oracle-die-zweite/#comment-148</guid>
		<description>You might be interested in the entry announcing the first release of the Hibernate NamingStrategy for Oracle: 

http://blog.schauderhaft.de/2009/03/07/oracle-naming-strategy-for-hibernate-released-as-a-proper-open-source-project/

And of course the Open Source Project

http://code.google.com/p/hibernate-naming-strategy-for-oracle/</description>
		<content:encoded><![CDATA[<p>You might be interested in the entry announcing the first release of the Hibernate NamingStrategy for Oracle: </p>
<p><a href="http://blog.schauderhaft.de/2009/03/07/oracle-naming-strategy-for-hibernate-released-as-a-proper-open-source-project/">http://blog.schauderhaft.de/2009/03/07/oracle-naming-strategy-for-hibernate-released-as-a-proper-open-source-project/</a></p>
<p>And of course the Open Source Project</p>
<p><a href="http://code.google.com/p/hibernate-naming-strategy-for-oracle/">http://code.google.com/p/hibernate-naming-strategy-for-oracle/</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Ziombel</title>
		<link>http://blog.schauderhaft.de/2008/03/29/hibernate-naming-strategie-fur-oracle-die-zweite/comment-page-1/#comment-142</link>
		<dc:creator>Ziombel</dc:creator>
		<pubDate>Tue, 03 Mar 2009 10:17:44 +0000</pubDate>
		<guid isPermaLink="false">http://blog.schauderhaft.de/2008/03/29/hibernate-naming-strategie-fur-oracle-die-zweite/#comment-142</guid>
		<description>English please :P</description>
		<content:encoded><![CDATA[<p>English please <img src='http://blog.schauderhaft.de/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
</channel>
</rss>

